package egovframework.npqs.pqi.mobile.jsonparser;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.json.JSONObject;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import com.sds.mobile.servicebrokerLib.ServiceBrokerLib;
import com.sds.mobile.servicebrokerLib.event.ResponseEvent;
import com.sds.mobile.servicebrokerLib.event.ResponseListener;

import egovframework.npqs.pqi.mobile.AppStatus;
import egovframework.npqs.pqi.mobile.common.Const;
import egovframework.npqs.pqi.mobile.jsoncontent.ErrorItem;

/**
 * @날짜	: 2014.11.19
 * @작성자	: 김준성
 * @내용	: 통신을위한 기본쓰레드
 */
public abstract class BasicThread extends Thread{
	protected String userId;
    protected String mResult;						//호출 결과값 저장
    protected String returnJson;					//호출된 JSON을 스트링에 저장
    protected JSONObject json;						//JSON 스트링을 JSON타입으로 담을 변수
    protected ProgressDialog mProgressDialog;		//프로그레스바
    protected ErrorItem errorItem;
    protected Context context;
    protected AppStatus appStatus;
    
    protected ServiceBrokerLib lib;
    protected ResponseListener listener;
    protected static final String TAG = "test";
	protected Handler handler;
	protected Intent intent;
	
	protected final static int RETURN_HANDLER = 0; 
	
    public BasicThread(String userId){
    	this.userId = userId;
    	mResult="";
    	
    	handler = new Handler(){
        	@Override
        	public void handleMessage(Message msg) {
        		super.handleMessage(msg);
        		//alert();
        	}
        };
    }
    
    /*private void alert(){
    	AlertDialog.Builder db = new AlertDialog.Builder(this);
		db.setTitle("알림")
		.setMessage("얼럿") 
		.setCancelable(true)
		.setPositiveButton("확인", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				//
			}
		})
		.show(); 
    }*/
    
    //분기 파라미터와 파라미터를 변수로 받아 스트링으로 출력
    //ex) http://152.99.157.173:8086/index.do?paramTarget=REQ001&userId=cn=135오동렬001
    public String parameterReturn(String paramTarget, HashMap<String, String> param){
		StringBuffer result = new StringBuffer();
		int size = param.size();
		String key = "";
		String value = "";
		ArrayList<String> paramKey = new ArrayList<String>();
		ArrayList<String> paramValue = new ArrayList<String>();
		Log.i("param Size",size+"");
		
		if(null != value && !"".equals(paramTarget) && size>0){
			Set<String> keySet = param.keySet();
			for(Iterator<String> iterator = keySet.iterator(); iterator.hasNext();){
				key = (String) iterator.next();
				value = param.get(key);
				if(null != value && !"".equals(value)){
					paramKey.add(key);
					paramValue.add(param.get(key));
				}
			}

			result.append(Const.PARAM_TARGET+"="+paramTarget);
			for(int i=0; i<paramValue.size(); i++){
				result.append("&"+paramKey.get(i)+"="+paramValue.get(i));
			}
		}
		
		return result.toString();
	}
    
    public void serviceBroker(String param, final Context context2){
    	
    	intent = new Intent();
    	errorItem = new ErrorItem();
        intent.putExtra("ipAddress", "125.60.21.170");			//접속서버 ip (고정값)
        intent.putExtra("portNumber", "443");					//접속서버 port (고정값)
        intent.putExtra("connectionType", "https");				//접속서버 type (고정값)
        intent.putExtra("contextUrl", "mois/rpc");				//접속서버 contextUrl (고정값)
        intent.putExtra("dataType", "json");
        //intent.putExtra("sCode", "MAFRA_QUARANTINE_TEST");		//발급받은 test serviceId 현장행정 전환되면서 태스트 배드는 없음
        intent.putExtra("sCode", "CG24_MAFRA_QIA");				//발급받은 main serviceId
        //한글 인코딩해보자
        /*String encodedStr=null;
        try {
			encodedStr = new String(param.getBytes("utf-8"),"iso-8859-1");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
        intent.putExtra("parameter", param);
        Log.i("param", param);
        
    	listener = new ResponseListener() {
            public void receive(ResponseEvent re) {
            	System.out.println("receive.....2");
                //서버로부터 받은 응답은 ResponseEvent 객체 re에 저장된다.
                int resultCode = re.getResultCode();
                returnJson = re.getResultData();
                //handler.sendEmptyMessage(resultCode);
                Log.d(TAG, "resultCode :: " + resultCode);
                Log.i("Result call", "->"+mResult);
                //mResult += "오류코드 : " + errorCode + "\n결과값 : " + errorMsg + "\n설명 : " + explain;
                //mResult = null;
                mResult = resultCode+"";
                Log.i("mResult0", mResult);
                
                Message msg = handler.obtainMessage();
                msg.what = RETURN_HANDLER;
                msg.obj = "error";
                messageHandler.sendMessage(msg);
                
            }
        };
        
        lib = new ServiceBrokerLib(context, listener);
        System.out.println("request....1");
        lib.request(intent);
        
    }
    
    Handler messageHandler = new Handler(){
    	
    	public void handleMessage(Message msg) {
    		System.out.println("handler......3 message : "+msg.obj);
    		switch (msg.what) {
			case RETURN_HANDLER:
				if("-109".equals(mResult) || "-100".equals(mResult)){
	    			//errorItem.setrDesc("통신 에러 입니다.");
	            	appStatus.dialog.dismiss();
	            	appStatus.utilm.ShowDialog(context, "오류", "통신 에러", 10);
	            	return;
	    		}
	            settingObject();
				break;

			default:
				break;
			}
    		
    	};
    };
    
    
    //콜백후 받아온 값들을 넣어주는 추상매서드 사용자가 직접구현.
  	public abstract void settingObject();
    
    //서비스브로커를 사용하기전 태스트 하는 로직
    public void serviceTestBroker(String param){
		String line = "";
		String responseJsonData = null;
		//String url = Const.MAIN_URL+"?"+param;
		String url = "http://10.110.128.40:8086/upload/fe/pqi/mobile/2014/09/02/2014028124_01.jpg";
		Log.i("url call","->"+url);
		BufferedReader in = null;
		
		try {
		    StringBuilder sb = new StringBuilder();
		    String x = "";
		    //방법1
			/*URL httpurl = new URL(url);
			URLConnection  tc= httpurl.openConnection();*/
		    
		    //방법2
		    URL httpurl = new URL(url);
		    HttpURLConnection tc = (HttpURLConnection)httpurl.openConnection();
		    tc.setDefaultUseCaches(false);
		    tc.setDoInput(true);
		    tc.setDoOutput(true);
		    tc.setRequestMethod("POST");
		    tc.setRequestProperty("content-type", "application/x-www-form-urlencoded");
		    
			in = new BufferedReader(new InputStreamReader(tc.getInputStream(), "UTF-8"));
			
			if(in !=null){
			    while ((line = in.readLine()) != null) {
			    sb.append(line + "\n");
			        x = sb.toString();
			    }
		    responseJsonData = new String(x);
		    }
			
		}catch (UnknownHostException uh){            
		    Log.v("NewWebHelper", "Unknown host :");
		        uh.printStackTrace();
		}catch (FileNotFoundException e) {
		       Log.v("NewWebHelper", "FileNotFoundException :");
		    e.printStackTrace();
		}catch (IOException e) {
		    Log.v("NewWebHelper", "IOException :");
		        e.printStackTrace();
		}catch (Exception e) {
			Log.v("NewWebHelper", "Exception :");
			e.printStackTrace();
		}finally{
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		mResult = "리턴 매세지 : " + responseJsonData;
		//mResult = null;
		
		Log.i("Result call", "->"+mResult);
		returnJson = responseJsonData;
        settingObject();
    }
    
    //서비스브로커를 사용하여 통신시작
	/*public void serviceBroker(String param) {
		Log.i("param call","->"+param);
		System.out.println(param.length());
        //ServiceBrokerLib 클래스 객체 생성과 종류 후 실행할 명령 등록
        ServiceBrokerLib lib = new ServiceBrokerLib(new ResponseListener() {

            public void receive(ResponseEvent re) {
                //서버로부터 받은 응답은 ResponseEvent 객체 re에 저장된다.
                int errorCode = re.getResultCode();
                String errorMsg = re.getResultData();
                //에러코드와 결과를 토스트로 보여줌.
                //mProgressDialog.dismiss();
                ReceiveToastMsg(errorCode, errorMsg);
            }
        });
        Log.d("Service Broker", "ServiceBrokerLib 객체 생성, receive 등록");

        //semp 접속에 필요한 parameter들을 intent에 담아서 전송한다. Service Broker Library 실행
        Intent intent = new Intent();
        
        intent.putExtra("connectionType", "http"); 	 			// 행정용 앱에서는 항상 "http"로 고정
        intent.putExtra("ipAddress", "127.0.0.1");  			// 행정용 앱에서는 항상 "127.0.0.1" 로 고정
        intent.putExtra("portNumber", "3800");      			// 행정용 앱에서는 항상 "3800" 으로 고정
        intent.putExtra("contextUrl", "semp");      			// 행정용 앱에서는 항상 "semp" 로 고정
        intent.putExtra("dataType", "json");        			// 행정용 앱에서는 json 이나 xml 형식을 사용
        intent.putExtra("paramEncrypted", true);    			// 행정용 앱에서는 항상 true 로 고정
        intent.putExtra("paramCompressee", true);   			// 행정용 앱에서는 항상 true 로 고정
        //intent.putExtra("userId", appStatus.getmUserId());	// GPKI CN 값을 입력한다.
        intent.putExtra("userId", userId);         				// GPKI CN 값을 입력한다.
        intent.putExtra("timeoutInterval", 30000);  			// 단말과 서버간 network timeout 값이다. 행정용 앱에서는 상황에 맞게 적당한 값을 입력한다. (단위는 ms 이며, 기본값은 30초 ->  30000)
        intent.putExtra("sType", "rest");             			// 행정용 앱에서는 항상 "rest"로 고정. (예제에서만 db를 사용했다.)
        intent.putExtra("sCode", "MAFRA_QUARANTINE_TEST");  	// 발급받은 테스트   service id(MAFRA_QUARANTINE_TEST)를 입력한다.
        //intent.putExtra("sCode", "CG24_MAFRA_QIA");				// 발급받은 운용서버 service id(CG24_MAFRA_QIA)
        intent.putExtra("parameter", param);          			// 행망 내에 위치한 기간계에 post 로 전달할 값을 입력한다.
        //intent.putExtra("parameter", "paramTarget=REQ001&userId=cn=135오동렬001");
        														// 행망 내에 위치한 기간계에 post 로 전달할 값을 입력한다.
        
        // Service Broker Request
        lib.request(intent);
        Log.d("Service Broker", "SEMP service 요청");
    }*/
	
	//서비스브로커의 콜백매서드
	/*private void ReceiveToastMsg(int errorCode, String errorMsg) {
		Log.i("서비스 브로거 리시브", "서비스 브로거 리시브");
        String explain = null;

        //에러코드에 따른 설명을 보여주는 구문
        switch (errorCode) {
            case 0:
                errorMsg = "SUCCESS \nResultData : " + errorMsg;
                explain = "성공";
                Log.d("Service Broker", "SEMP 연결 성공");
                break;
            case 1:
                explain = "서비스가 존재하지 않는 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 2:
                explain = "서비스 브로커가 보내는 암호 코드가 잘못된 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 3:
                explain = "사용자 정보 혹은 서비스 정보가 부족한 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 4:
                explain = "사용자 권한이 없는 서비스로 접근 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 5:
                explain = "현재 인증서가 유효하지 않는 경우 발생하는 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 9:
                explain = "기타 Request 처리 부분에서 발생하는 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 10:
                explain = "파일 다운로드시 파일을 읽을 수 없음";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 11:
                explain = "파일 첨부시 발생 한 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 12:
                explain = "파일 다운로드시 발생 한 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 101:
                explain = "SAP Backend 서버 접속 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 102:
                explain = "BAPI 호출 시 잘못된 파라메터 전송 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 103:
                explain = "SAP Connector에서 발생한 일반적인 오류(관리자 확인)";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 200:
                explain = "DB Connector에서 발생한 일반적인 오류(관리자 확인)";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 900:
                explain = "사용자 인증시 파리미터가 부족한 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 901:
                explain = "등록되지 않은 사용자";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 902:
                explain = "사용자 인증 오류(전화번호)";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 903:
                explain = "사용자 인증 오류(사용자 정보 - 암호)";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 904:
                explain = "Provision시 발생하는 사용자 인증관련 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case -100:
                explain = "모바일의 네트워크가 사용 불가능 할 때의 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case -101:
                explain = "서비스 브로커 호출시 Mode를 offline으로 지정하였을 경우의 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case -102:
                explain = "서비스 브로커 호출시 User ID를 입력하지 않을 경우의 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case -103:
                explain = "서비스 브로커 호출시 서비스 코드를 입력하지 않을 경우의 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case -104:
                explain = "서비스 브로커 호출시 서버 주소를 지정하지 않을 경우의 오류";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case -107:
                explain = "서비스 브로커 호출에서 서버 연결 중 timeout 발생";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case -108:
                explain = "서비스 브로커 에서 서버 연결 시도 중 예외상황 발생";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case -109:
                explain = "서비스 브로커 실행 중 예상치 못한 예외 상황 발생";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
            case 403:
            case 404:
            case 500:
                explain = "서버 페이지 오류(HTTP 오류코드)";
                Log.d("Service Broker", "SEMP 연결 실패");
                break;
        }
        //mResult += "오류코드 : " + errorCode + "\n결과값 : " + errorMsg + "\n설명 : " + explain;
        mResult = null;
        Log.i("Result call", "->"+mResult);
        returnJson = errorMsg;
        settingObject();
    }*/
	
}
